#include "gd32f30x.h"
#include "gpio.h"

static void GpioRcuConfig(void)
{
	rcu_periph_clock_enable(RCU_GPIOA);
	rcu_periph_clock_enable(RCU_GPIOB);
	rcu_periph_clock_enable(RCU_GPIOC);

	rcu_periph_clock_enable(RCU_AF);
}

static void GpioTimer0Config(void)
{
	/* PA8(TIMER0_CH0) */
	gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
	/* PA9(TIMER0_CH1) */
	gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
	/* PA10(TIMER0_CH2) */
	gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
	/* PB13(TIMER0_CH0) */
	gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13);	
	/* PB14(TIMER0_CH1) */
	gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_14);
	/* PB15(TIMER0_CH2) */
	gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15);
}

static void GpioAdc0Config(void)
{
	/* VBUS */
	gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ,GPIO_PIN_0);
	/* ISNESB */
	gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ,GPIO_PIN_1);
	/* ISENSC */
	gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ,GPIO_PIN_2);
}

static void GpioSpi0Config(void)
{
	/* SPI0 GPIO Config */
	/* SCK/PA5, MISO/PA6, MOSI/PA7 */
	gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_7);
	gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
	/* PC13 as nCS */
	gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13);
}

static void GpioCan0Config(void)
{
    /* configure CAN0 GPIO */
    gpio_init(GPIOA,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,GPIO_PIN_11);
    gpio_init(GPIOA,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_12);
    //gpio_pin_remap_config(GPIO_CAN_FULL_REMAP,ENABLE);
}


void GpioConfig(void)
{
	GpioRcuConfig();
	GpioTimer0Config();
	GpioAdc0Config();
	GpioSpi0Config();
	GpioCan0Config();
}